package com.agv.core.dao.dataExtractor;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import java.util.LinkedHashMap;

import java.util.List;
import org.springframework.jdbc.core.ResultSetExtractor;



public class TypesAndDataRowMapper implements ResultSetExtractor{
	
	
	public List< LinkedHashMap<String,Object> > extractData(ResultSet rs)
	throws SQLException {
		
		List< LinkedHashMap<String,Object> > datosTabla = new ArrayList<  LinkedHashMap<String,Object>>(); 
		LinkedHashMap<String, Object> fila = new LinkedHashMap<String, Object>();
		
		ResultSetMetaData rsmd = rs.getMetaData();
		int numCols = rsmd.getColumnCount();
		
		
		for (int i = 1; i <= numCols; i++) {
			fila.put(rsmd.getColumnName(i),  convertTimeTODate( rsmd.getColumnClassName(i) ) );
		}
		
		datosTabla.add(fila);
		
		
		while( rs.next() ){
			
			fila = new LinkedHashMap<String, Object>();
			for (int i = 1; i <= numCols; i++) {
				fila.put(rsmd.getColumnName(i), formateaObjetosDate(rs.getObject(i))  );
			}
			
			datosTabla.add(fila);
		}
		

		return datosTabla;
		
	}
	
	
	
	//solo cambia el nombre de TimeStamp por el de Date, 
	//esto es para adaptarse a la logica de la jsp 
	private String convertTimeTODate(String str){
		
		if( str.equals("java.sql.Timestamp") ){
			return "java.util.Date";
			
		}else if( str.equals("java.sql.Date") ){
			return "java.util.Date";
		}
		
		return str;
	}
	
	
	//si es timestamp o date, los regresa como String formateado
	private Object formateaObjetosDate(Object fechaD){

		if(fechaD instanceof Date){
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			return sdf.format(fechaD);
		}
		
		return fechaD;
		
	}
	
	
	

}










 		

